<?php

namespace Users\Register;

use \Action as BaseAction;
use Pinenut\User\Auth\Model;
use Users\Helper\SmartRedirect;

/**
 * Общий скелет регистрации
 *
 * @author kosh
 *        
 */
abstract class Action extends BaseAction {

	function privileges() {
		return '#unauthorized';
	}
	
	abstract function auth();
	abstract function profile();
	abstract function afterLogin();
	abstract function afterRegister();
	protected $auth;
	protected function run() {
		$onlyRender = $this->response->onlyRender = (bool)$this->request->onlyRender;
		$this->response->noCache(!$onlyRender);

		if (!$onlyRender && !$this->request->isPartial) {
			$redirectUrl = $_SERVER['HTTP_REFERER'];
			if (!empty($redirectUrl)) {
				SmartRedirect::rememberRedirectPoint($redirectUrl);
			}
		}

		// аутентифицируемся
		$auth = $this->auth ();

		if (! ($auth instanceof Model)) {
			return;
		}

		if ($auth->isExist ()) {
			$auth = $auth->auth ();
			// уже существует - редиректим куда-нить
			// логинимся
			$ref = $auth->profile->get ();
			if ($ref) {
				$profile = $ref->getEntity ();
				// echo "<pre>";print_r($ref); print_r($profile );exit;
			}
			if (! $profile) {
				throw new \Exception ( 'Profile not found' );
			}

			// аутентифицируем
			\Application::auth ()->login ( ( string ) $profile );

			$this->afterLogin ();
			
		} else {

			// заполняем профиль
			$profile = $this->profile ( $auth );
			if (! $profile) {
				throw new \Exception ( 'Profile not found' );
			}

			$profile->auths [$auth];
			$auth->profile [$profile];

			// сохраняем
			$auth->save ();
			$profile->save ();

			// аутентифицируем
			\Application::auth ()->login ( ( string ) $profile );

			$this->afterRegister ();
		}
	}
}